﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.UI.WebControls;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data;
using System.Reflection;


namespace HelpDesk
{
    public class Estadisticas
    {
        QueryBuilder Consulta = new QueryBuilder();

        #region Private values
        private string[,] valores_muchos;//si es muchos a muchos
        private string[] valores;//si es uno a muchos
        #endregion

        #region Graficar
        /// <summary>
        /// </summary>
        /// <param name="lista_X">Listbox del Eje X seleccionado por el usuario cuando el checkbox es true del eje X</param>
        /// <param name="lista_Y">Listbox del Eje Y seleccionado por el usuario cuando el checkbox es true del eje Y</param>
        /// <param name="eje_X">Valores obtenidos de la consulta del sql</param>
        public bool Grafica(ListBox lista_X, ListBox lista_Y, string[] values_count, string[,] values_count_all, string X, string Y, string tipo_grafica,string fi, string ff, string Xvs, string vsY)
        {
            fi = fi.Replace('/', '-');
            ff = ff.Replace('/', '-');
            //en esta variable se va a almacenar el path a donde se va a guardar el reporte
            string ubicacion = "C:\\Graficas\\"+fi+"_Graficas_"+Xvs+"_VS_"+vsY+"_"+ff;
            bool creado = false;
            //variables para poder crear el libro y cada una de los sheets del libro
            Excel.Application xlApp;//crea la aplicación
            Excel.Workbook xlWorkBook;//jala el libro
            Excel.Worksheet xlWorkSheet;//crea el sheet
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            //agregar los datos de cada una de las consultas. 
            xlWorkSheet.Cells[1, 1] = "";

            if (lista_X == null && lista_Y == null) //ES UNO A UNO
            {
                xlWorkSheet.Cells[1, 2] = X;//encabezado en X

                xlWorkSheet.Cells[2, 1] = Y;//encabezado en Y
                xlWorkSheet.Cells[2, 2] = values_count[0].ToString();//valores a insertar
                creado = true;
            }
            else if (lista_X == null && lista_Y != null)//ES UNO A MUCHOS
            {
                xlWorkSheet.Cells[1, 2] = X;//encabezado en X

                for (int l = 0; l < lista_Y.Items.Count; l++)//encabezado en Y
                {
                    xlWorkSheet.Cells[l + 2, 1] = lista_Y.Items[l].Value;
                }

                for (int i = 0; i < lista_Y.Items.Count; i++)//valores a insertar
                {
                    xlWorkSheet.Cells[i + 2, 2] = values_count[i].ToString();
                }
                creado = true;
            }
            else if (lista_X != null && lista_Y == null) //ES MUCHOS A UNO
            {
                xlWorkSheet.Cells[2, 1] = Y;

                for (int i = 0; i < lista_X.Items.Count; i++) //encabezado en X
                {
                    xlWorkSheet.Cells[1, i + 2] = lista_X.Items[i].Value;
                }

                for (int j = 0; j < lista_X.Items.Count; j++)//valores a insertar
                {
                    xlWorkSheet.Cells[2, j + 2] = values_count[j].ToString();
                }
                creado = true;
            }
            else if (lista_X != null && lista_Y != null)//ES MUCHOS A MUCHOS
            {
                for (int i = 0; i < lista_X.Items.Count; i++)//encabezado en X
                {
                    xlWorkSheet.Cells[1, i + 2] = lista_X.Items[i].Value;
                }

                for (int l = 0; l < lista_Y.Items.Count; l++)//encabezado en Y
                {
                    xlWorkSheet.Cells[l + 2, 1] = lista_Y.Items[l].Value;
                }

                for (int j = 0; j < lista_Y.Items.Count; j++)//valores a insertar
                {
                    for (int h = 0; h < lista_X.Items.Count; h++)
                    {
                        xlWorkSheet.Cells[j + 2, h + 2] = values_count_all[h, j].ToString();
                    }
                }
                creado = true;
            }

            if (creado == true)
            {
                Excel.Range chartRange;//crear gráfica

                Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
                Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250);
                Excel.Chart chartPage = myChart.Chart;

                if (lista_Y != null)
                    chartRange = xlWorkSheet.get_Range("A1", "M" + Convert.ToString(lista_Y.Items.Count + 1));
                else
                    chartRange = xlWorkSheet.get_Range("A1", "M2");
                chartPage.SetSourceData(chartRange, misValue);

                //tipos de graficos que se pueden seleccionar

                switch (tipo_grafica)
                {
                    case "Barras":
                        chartPage.ChartType = Excel.XlChartType.xlColumnClustered;  //barras 
                        break;

                    case "Areas 3D":
                        chartPage.ChartType = Excel.XlChartType.xl3DArea; //areas en 3d bien rex
                        break;

                    case "Columnas 3D":
                        chartPage.ChartType = Excel.XlChartType.xlCylinderCol; //columnitas de frente
                        break;

                    case "Cilindros 3D":
                        chartPage.ChartType = Excel.XlChartType.xlCylinderColClustered; //cilindritos de frente
                        break;

                    case "Piramide 3D":
                        chartPage.ChartType = Excel.XlChartType.xlPyramidCol;  //piramides 
                        break;

                    case "Pie 3D":
                        chartPage.ChartType = Excel.XlChartType.xl3DPieExploded;
                        break;
                }

                //exportar el excel con los datos obtenidos 
                xlWorkBook.SaveAs(@"" + ubicacion + ".xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();

                releaseObject(xlWorkSheet);
                releaseObject(xlWorkBook);
                releaseObject(xlApp);
                return creado;
            }
            else
                return creado;
        }
        #endregion

        #region release_Object
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                ex.ToString();
                //                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
        #endregion

        #region Crear_Grafica

        public bool Crear_Grafica(ListBox Lista_X, ListBox Lista_Y, string X, string Y, string sql, string fi, string ff, string tipo_grafica, string tipo,string tipo_query)
        {
            bool creado = false;
            string[] valores;
            DataTable datos = new DataTable();
            try
            {
                if (Lista_X == null && Lista_Y == null && !X.Equals("") && !Y.Equals(""))//ES UNO A UNO
                {
                    datos = Consulta.EjecutarQuery(sql);
                    valores = new string[datos.Rows.Count];
                    valores[0] = datos.Rows[0].ItemArray[0].ToString();
                    creado = Grafica(null, null, valores, null, X, Y, tipo_grafica,fi,ff,tipo,tipo_query);
                }
                else if (Lista_X == null && Lista_Y != null && !X.Equals("") && Y.Equals("")) //ES UNO A MUCHOS
                {
                    if (tipo.Equals("Areas"))
                        creado = datos_areas(Lista_X, X, Y, Lista_Y, fi, ff, tipo_grafica, tipo,tipo_query);
                    else if (tipo.Equals("Infraestructuras"))
                        creado = datos_infraestructuras(Lista_X,X,Y,Lista_Y,fi,ff,tipo_grafica,tipo,tipo_query);
                    else if (tipo.Equals("Usuarios"))
                        creado = datos_usuarios(Lista_X, X, Y, Lista_Y, fi, ff, tipo_grafica, tipo,tipo_query);
                    else if (tipo.Equals("Problemas"))
                        creado = datos_problemas(Lista_X, X, Y, Lista_Y, fi, ff, tipo_grafica, tipo,tipo_query);
                }
                else if (Lista_X != null && Lista_Y == null && X.Equals("") && !Y.Equals(""))//ES MUCHOS A UNO 
                {
                    if (tipo.Equals("Areas"))
                        creado = datos_areas(Lista_X, "", Y, null, fi, ff, tipo_grafica, tipo, tipo_query);
                    else if (tipo.Equals("Infraestructuras"))
                        creado = datos_infraestructuras(Lista_X, "", Y, null, fi, ff, tipo_grafica, tipo,tipo_query);
                    else if (tipo.Equals("Usuarios"))
                        creado = datos_usuarios(Lista_X, "", Y, null, fi, ff, tipo_grafica, tipo,tipo_query);
                    else if (tipo.Equals("Problemas"))
                        creado = datos_problemas(Lista_X, "", Y, null, fi, ff, tipo_grafica, tipo,tipo_query);
                }
                else if (Lista_X != null && Lista_Y != null)//ES MUCHOS A MUCHOS
                {
                    if (tipo.Equals("Areas"))
                        creado = datos_areas(Lista_X, "", "", Lista_Y, fi, ff, tipo_grafica, tipo, tipo_query);
                    else if (tipo.Equals("Infraestructuras"))
                        creado = datos_infraestructuras(Lista_X, "", "", Lista_Y, fi, ff, tipo_grafica,tipo ,tipo_query);
                    else if (tipo.Equals("Usuarios"))
                        creado = datos_usuarios(Lista_X, "", "", Lista_Y, fi, ff, tipo_grafica, tipo, tipo_query);
                    else if (tipo.Equals("Problemas"))
                        creado = datos_problemas(Lista_X, "", "", Lista_Y, fi, ff, tipo_grafica, tipo, tipo_query);
                }
            }
            catch
            {
                return false;
            }
            return creado;
        }

        #endregion

        #region Areas
        public bool datos_areas(ListBox Lista_X, string X, string Y, ListBox Lista_Y, string fi, string ff, string tipo_grafica, string tipo, string tipo_query)
        {
            bool terminado = false;
            DataTable dato = new DataTable();
            int L_X = 0;
            int L_Y = 0;
            string tipo_valores = "";
            if (Lista_X != null && Lista_Y != null)
            {
                L_X = Lista_X.Items.Count;
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "mam";//muchos a muchos
                valores_muchos = new string[L_X, L_Y];//asigna tamaño al vector
            }
            else if(Lista_X == null && Lista_Y !=null)
            {
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "uam";//uno a muchos
                valores = new string[L_Y];
            }
            else if (Lista_X != null && Lista_Y == null)
            {
                L_X = Lista_X.Items.Count;
                tipo_valores = "mau";//muchos a uno
                valores = new string[L_X];
            }
            try
            {
                string sql = "";
                switch (tipo_valores)
                {
                    case("mau"):
                        if (tipo_query.Equals("Infraestructuras"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_X.Items[i].ToString() + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_X.Items[i].ToString() + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_X.Items[i].ToString() + "') and problema= (select id_problema from problema where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                    case("mam"):
                        if (tipo_query.Equals("Infraestructuras"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_X.Items[i].ToString() + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Lista_Y.Items[y].Value + "')";

                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios")) 
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_X.Items[i].ToString() + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_Y.Items[y].ToString() + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas")) 
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_X.Items[i].ToString() + "') and problema= (select id_problema from problema where descripcion='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }

                        break;
                    case("uam"):
                        if (tipo_query.Equals("Infraestructuras"))
                        {                               
                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + X + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {

                            for(int i=0;i<L_Y;i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + X + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and area_origen= (select id_area from Area_trabajo where descripcion='" + X + "') and problema= (select id_problema from problema where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                }
            }
            catch { return terminado; }
            return terminado;
        }
        #endregion

        #region Infraestructuras
        public bool datos_infraestructuras(ListBox Lista_X, string X, string Y, ListBox Lista_Y, string fi, string ff, string tipo_grafica, string tipo, string tipo_query)
        {
            bool terminado = false;
            DataTable dato = new DataTable();
            int L_X = 0;
            int L_Y = 0;
            string tipo_valores = "";
            if (Lista_X != null && Lista_Y != null)
            {
                L_X = Lista_X.Items.Count;
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "mam";//muchos a muchos
                valores_muchos = new string[L_X, L_Y];//asigna tamaño al vector
            }
            else if (Lista_X == null && Lista_Y != null)
            {
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "uam";//uno a muchos
                valores = new string[L_Y];
            }
            else if (Lista_X != null && Lista_Y == null)
            {
                L_X = Lista_X.Items.Count;
                tipo_valores = "mau";//muchos a uno
                valores = new string[L_X];
            }
            try
            {
                string sql = "";
                switch (tipo_valores)
                {
                    case ("mau"):
                        if (tipo_query.Equals("Areas"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + Lista_X.Items[i].ToString() + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + Lista_X.Items[i].ToString() + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + Lista_X.Items[i].ToString() + "') and problema= (select id_problema from problema where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                    case ("mam"):
                        if (tipo_query.Equals("Areas"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + Lista_X.Items[i].ToString() + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + Lista_X.Items[i].ToString() + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_Y.Items[y].ToString() + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + Lista_X.Items[i].ToString() + "') and problema= (select id_problema from problema where descripcion='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }

                        break;
                    case ("uam"):
                        if (tipo_query.Equals("Areas"))
                        {
                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + X + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + X + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_Y.Items[i].ToString() + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Infraestructura= (select id_infraestructura from Infraestructura where descripcion='" + X + "') and problema= (select id_problema from problema where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                }
            }
            catch { return terminado; }
            return terminado;
        }
        #endregion

        #region Usuarios
        public bool datos_usuarios(ListBox Lista_X, string X, string Y, ListBox Lista_Y, string fi, string ff, string tipo_grafica, string tipo,string tipo_query)
        {
            bool terminado = false;
            DataTable dato = new DataTable();
            int L_X = 0;
            int L_Y = 0;
            string tipo_valores = "";
            if (Lista_X != null && Lista_Y != null)
            {
                L_X = Lista_X.Items.Count;
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "mam";//muchos a muchos
                valores_muchos = new string[L_X, L_Y];//asigna tamaño al vector
            }
            else if (Lista_X == null && Lista_Y != null)
            {
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "uam";//uno a muchos
                valores = new string[L_Y];
            }
            else if (Lista_X != null && Lista_Y == null)
            {
                L_X = Lista_X.Items.Count;
                tipo_valores = "mau";//muchos a uno
                valores = new string[L_X];
            }
            try
            {
                string sql = "";
                switch (tipo_valores)
                {
                    case ("mau"):
                        if (tipo_query.Equals("Areas"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_X.Items[i].ToString() + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Infraestructuras"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_X.Items[i].ToString() + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_X.Items[i].ToString() + "') and problema= (select id_problema from problema where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                    case ("mam"):
                        if (tipo_query.Equals("Areas"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_X.Items[i].ToString() + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Infraestructuras"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_X.Items[i].ToString() + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Lista_Y.Items[y].ToString() + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_X.Items[i].ToString() + "') and problema= (select id_problema from problema where descripcion='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }

                        break;
                    case ("uam"):
                        if (tipo_query.Equals("Areas"))
                        {
                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + X + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Infraestructuras"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + X + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Lista_Y.Items[i].ToString() + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Problemas"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and usuario_ticket= (select id_usuario from usuario where id_usuario='" + X + "') and problema= (select id_problema from problema where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                }
            }
            catch { return terminado; }
            return terminado;
        }
        #endregion

        #region Problemas
        public bool datos_problemas(ListBox Lista_X, string X, string Y, ListBox Lista_Y, string fi, string ff, string tipo_grafica, string tipo, string tipo_query)
        {
            bool terminado = false;
            DataTable dato = new DataTable();
            int L_X = 0;
            int L_Y = 0;
            string tipo_valores = "";
            if (Lista_X != null && Lista_Y != null)
            {
                L_X = Lista_X.Items.Count;
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "mam";//muchos a muchos
                valores_muchos = new string[L_X, L_Y];//asigna tamaño al vector
            }
            else if (Lista_X == null && Lista_Y != null)
            {
                L_Y = Lista_Y.Items.Count;
                tipo_valores = "uam";//uno a muchos
                valores = new string[L_Y];
            }
            else if (Lista_X != null && Lista_Y == null)
            {
                L_X = Lista_X.Items.Count;
                tipo_valores = "mau";//muchos a uno
                valores = new string[L_X];
            }
            try
            {
                string sql = "";
                switch (tipo_valores)
                {
                    case ("mau"):
                        if (tipo_query.Equals("Areas"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + Lista_X.Items[i].ToString() + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Infraestructuras"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + Lista_X.Items[i].ToString() + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {
                            for (int i = 0; i < Lista_X.Items.Count; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + Lista_X.Items[i].ToString() + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Y + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(Lista_X, null, valores, null, "", Y, tipo_grafica,fi,ff, tipo,tipo_query);
                        }
                        break;
                    case ("mam"):
                        if (tipo_query.Equals("Areas"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + Lista_X.Items[i].ToString() + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff, tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Infraestructuras"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + Lista_X.Items[i].ToString() + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Lista_Y.Items[y].ToString() + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {
                            int y = 0;
                            while (y != Lista_Y.Items.Count)
                            {
                                for (int i = 0; i < L_X; i++)
                                {
                                    sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + Lista_X.Items[i].ToString() + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_Y.Items[y].Value + "')";
                                    dato = Consulta.EjecutarQuery(sql);
                                    valores_muchos[i, y] = dato.Rows[0].ItemArray[0].ToString();
                                }
                                y++;
                            }
                            terminado = Grafica(Lista_X, Lista_Y, null, valores_muchos, "", "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }

                        break;
                    case ("uam"):
                        if (tipo_query.Equals("Areas"))
                        {
                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + X + "') and area_origen= (select id_area from Area_trabajo where descripcion='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Infraestructuras"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + X + "') and infraestructura= (select id_infraestructura from infraestructura where descripcion='" + Lista_Y.Items[i].ToString() + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        else if (tipo_query.Equals("Usuarios"))
                        {

                            for (int i = 0; i < L_Y; i++)
                            {
                                sql = "select count(id_ticket) from ticket where Fecha_inicio between '" + fi + "' and '" + ff + "' and Problema= (select id_problema from Problema where descripcion='" + X + "') and usuario_ticket= (select id_usuario from usuario where id_usuario='" + Lista_Y.Items[i].Value + "')";
                                dato = Consulta.EjecutarQuery(sql);
                                valores[i] = dato.Rows[0].ItemArray[0].ToString();
                            }
                            terminado = Grafica(null, Lista_Y, valores, null, X, "", tipo_grafica,fi,ff,tipo,tipo_query);
                        }
                        break;
                }
            }
            catch { return terminado; }
            return terminado;
        }
        #endregion
    }
}
